package com.example.liqm.test;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by liqm on 2017/7/5.
 */

public class SwitchButton extends View {
    //设置背景图片
    private Bitmap backgroudBitmap;
    //滑块图片
    private Bitmap slideBitmap;

    //滑块左边的起始点位置
    private  int slideIconLeftStart = 0;
    private int sliderIconLeftMax ;//滑动左边的起始位置的最大值
    private float downX;

    //当前是否移动
    private boolean isMoveing = false;
    private  boolean isOpen = false;
    //开关按钮的状态，默认是关闭的

    //声明接口变量
private OnCheckedChangeListener onCheckedChangeListener ;

    public SwitchButton(Context context) {
        this(context,null,0);
    }

    public SwitchButton(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public SwitchButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //重新设置测量规格
        widthMeasureSpec = MeasureSpec.makeMeasureSpec(backgroudBitmap.getWidth(),MeasureSpec.EXACTLY);
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(backgroudBitmap.getHeight(),MeasureSpec.EXACTLY);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
//绘制方法 canvas：画布
    @Override
    protected void onDraw(Canvas canvas) {

        /*
        * 绘制背景
        * bitmap ： 要绘制的图片的
        * left :相对于控件的左上角起始点 （控件的原点）的左边（x）偏移量
        * top:相对于控件的左上角的起始点 （控件的原点） 的顶部（y）
        * paint :  画笔
        * */
        int left  = 0;
        int top  = 0;
        canvas.drawBitmap(backgroudBitmap,left,top,null);
        //绘制滑块图片
        drawSlideIcon(canvas);
    }
    //绘制滑块图片
    private void drawSlideIcon(Canvas canvas) {
        if (isMoveing){
            canvas.drawBitmap(slideBitmap,slideIconLeftStart,0,null);

        }   else {
            if (isOpen){
                canvas.drawBitmap(slideBitmap,sliderIconLeftMax,0,null);
            }else {
                canvas.drawBitmap(slideBitmap,0,0,null );
            }
        }

    }

    //布局子控件的方法，对于view的话，该方法没有实际意义，对于viewgroup 则必须实现该方法
    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

    //事件处理方法

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //key 表示事件的动作
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN://按下去事件
                //保存按下去的店的位置，相对于原点的位置
                downX = event.getX();
                break;
            case MotionEvent.ACTION_MOVE://滑动事件
                isMoveing = true;
                float moveX = event.getX();
                //取得滑动的偏移量
                float dx =moveX -downX;
                slideIconLeftStart+=dx;
                //防止越界
                if (slideIconLeftStart<=0){
                    slideIconLeftStart=0;
                } else if (slideIconLeftStart>sliderIconLeftMax) {
                    slideIconLeftStart =sliderIconLeftMax;
                }
                downX = moveX;
                break;
            case MotionEvent.ACTION_UP:
                isMoveing = false;
                boolean newState = slideIconLeftStart<=slideIconLeftStart/2?false:true;
                //当状态发生改变，则回调
                if (newState!=isOpen){
                    isOpen= newState;
                    if (onCheckedChangeListener!=null){
                          onCheckedChangeListener.onCheckedChanged(this,isOpen);
                    }
                }
                break;
        }
        invalidate();//重新绘制界面，内部会调用onDraw方法
        return true;   //表示事件消费完毕返回true
    }

    //设置背景图片
    public void setBackgroudBitmap(int drawableResId){
        //bitmap : 位图文件，以像素的形式来描述图片的大小的，则是位图文件 ：jpg , bmp ,png ,git
        Drawable drawable = getContext().getResources().getDrawable(drawableResId);
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        backgroudBitmap = bitmapDrawable.getBitmap();
        //设置滑块能滑到的左边最大值
        sliderIconLeftMax = backgroudBitmap.getWidth()-slideBitmap.getWidth();

    }
    //设置滑块图片
    public void setSlideBitmap(int drawableResId){
          Drawable drawable = getContext().getResources().getDrawable(drawableResId);
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        slideBitmap = bitmapDrawable.getBitmap();

    }

    //定义接口，实现调用者方法回调  ,用来处理按钮的事件
    public static interface OnCheckedChangeListener{
        void onCheckedChanged(SwitchButton button ,boolean isChecked);
    }

    //对外暴露一个方法，设置缺省状态
    public void setChecked(boolean b){
      //表示状态发生改变，接口回调
        if (b!=isOpen){
                isOpen = b;
            onCheckedChangeListener.onCheckedChanged(this,isOpen);
        }
        if (isOpen){
            //假如控件是打开状态，则滑块的起始位置为slideTconLeftMax;
            slideIconLeftStart = sliderIconLeftMax;
        }
    }

    //通过该方法，把接口对象传递进来
    public void setOnCheckedChangeListener(OnCheckedChangeListener listener){
           onCheckedChangeListener =listener;
    }

    //事件分发


    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        return super.dispatchTouchEvent(event);
    }
}
